Micron Document
πŸŽ–οΈGitΠ―Ρ€Π°πŸŽ–οΈ


Displaying Rendered β€’ View raw β€’ Download

specs/20260507-161858-app-docs-markdown/data-model.md docs/obtainium-generated-deeplinks (42f311dd) Text, 10.74 KB

Data Model: App Documentation (Android/KMP)

Overview

This feature introduces no Room entities and no durable database tables. Documentation content is packaged as build-time resources/assets and loaded into memory at runtime. Preferences are optional and limited to lightweight UX state (for example, remembering the last viewed section); the documentation corpus itself is never stored in Room.

The core runtime model is expressed as Kotlin T383838data class and T383838sealed interface types that can live in T383838feature/docs/src/commonMain/kotlin/... and be shared across Android, Desktop, and iOS.


Runtime Entities

1. T383838DocSection

Represents the top-level documentation buckets shown on the website and inside the app.

T282828
Tf0883e@Serializable
Tff7b72sealed Tff7b72interface T56d364DocSection Tb4b4b4{
Tf0883e@Serializable Tff7b72data Tff7b72object T56d364UserGuide Tb4b4b4: Te6edf3DocSection
Tf0883e@Serializable Tff7b72data Tff7b72object T56d364DeveloperGuide Tb4b4b4: Te6edf3DocSection
Tb4b4b4}


β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Property β”‚ Type β”‚ Notes β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ T383838id β”‚ derived β”‚ Stable logical ID such as T383838user or T383838developer β”‚
β”‚ T383838displayName β”‚ derived β”‚ UI label shown in TOC/search grouping β”‚
β”‚ T383838resourceDir β”‚ derived β”‚ T383838docs/user/ or T383838docs/developer/ β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Validation rules
β€’ Must map 1:1 to a top-level docs directory.
β€’ Must be stable across releases so deep links and keyword index entries remain valid.


2. T383838DocPage

Represents a single documentation page regardless of how it is rendered on a target.

T282828
Tf0883e@Serializable
Tff7b72data Tff7b72class T56d364DocPageTb4b4b4(
Tff7b72val Te6edf3idTb4b4b4: Tffa657StringTb4b4b4,
Tff7b72val Te6edf3titleTb4b4b4: Tffa657StringTb4b4b4,
Tff7b72val Te6edf3sectionTb4b4b4: Te6edf3DocSectionTb4b4b4,
Tff7b72val Te6edf3navOrderTb4b4b4: Tffa657IntTb4b4b4,
Tff7b72val Te6edf3resourcePathTb4b4b4: Tffa657StringTb4b4b4,
Tff7b72val Te6edf3keywordsTb4b4b4: Te6edf3ListTff7b72<Tffa657StringTff7b72>Tb4b4b4,
Tff7b72val Te6edf3aliasesTb4b4b4: Te6edf3ListTff7b72<Tffa657StringTff7b72> Tff7b72= Te6edf3emptyListTb4b4b4(Tb4b4b4)Tb4b4b4,
Tff7b72val Te6edf3charCountTb4b4b4: Tffa657IntTb4b4b4,
Tb4b4b4)


β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Field β”‚ Type β”‚ Description β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ T383838id β”‚ T383838String β”‚ Stable slug such as T383838messages-and-channels β”‚
β”‚ T383838title β”‚ T383838String β”‚ Human-readable page title β”‚
β”‚ T383838section β”‚ T383838DocSection β”‚ User or Developer Guide β”‚
β”‚ T383838navOrder β”‚ T383838Int β”‚ Intended sort order within the section β”‚
β”‚ T383838resourcePath β”‚ T383838String β”‚ Canonical packaged resource path, for example T383838docs/user/messages-… β”‚
β”‚ T383838keywords β”‚ T383838List<String> β”‚ Search/retrieval vocabulary generated at build time β”‚
β”‚ T383838aliases β”‚ T383838List<String> β”‚ Optional alternative search terms or renamed page slugs β”‚
β”‚ T383838charCount β”‚ T383838Int β”‚ Plain-text character count used for token budgeting β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Validation rules
β€’ T383838id must be unique across the full corpus.
β€’ T383838navOrder must be non-negative.
β€’ T383838resourcePath must resolve in the packaged bundle for every supported target.
β€’ T383838charCount must be T383838> 0.

State transitions
β€’ Immutable after load.
β€’ Replaced only when the shipped app version changes.


3. T383838DocPageContent

Decouples metadata from actual content so different targets can choose HTML or markdown rendering.

T282828
Tff7b72data Tff7b72class T56d364DocPageContentTb4b4b4(
Tff7b72val Te6edf3pageTb4b4b4: Te6edf3DocPageTb4b4b4,
Tff7b72val Te6edf3htmlTb4b4b4: Tffa657String? Tff7b72= Tff7b72nullTb4b4b4,
Tff7b72val Te6edf3markdownTb4b4b4: Tffa657String? Tff7b72= Tff7b72nullTb4b4b4,
Tff7b72val Te6edf3cssPathTb4b4b4: Tffa657String? Tff7b72= Tff7b72nullTb4b4b4,
Tb4b4b4)


β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Field β”‚ Type β”‚ Notes β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ T383838page β”‚ T383838DocPage β”‚ Metadata and lookup info β”‚
β”‚ T383838html β”‚ T383838String? β”‚ Preferred on Android/WebView and for site output parity β”‚
β”‚ T383838markdown β”‚ T383838String? β”‚ Optional fallback for Compose markdown rendering on Desktop/iOS β”‚
β”‚ T383838cssPath β”‚ T383838String? β”‚ Shared stylesheet path for HTML surfaces β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Rendering rules
β€’ Android normally prefers T383838html.
β€’ Desktop/iOS may prefer T383838markdown for Compose rendering, or T383838html if an embedded browser implementation is chosen.
β€’ At least one of T383838html or T383838markdown must be present for each page.


4. T383838DocBundle

Runtime aggregate of the full packaged documentation corpus.

T282828
Tff7b72data Tff7b72class T56d364DocBundleTb4b4b4(
Tff7b72val Te6edf3pagesTb4b4b4: Te6edf3ListTff7b72<Te6edf3DocPageTff7b72>Tb4b4b4,
Tff7b72val Te6edf3pageIndexTb4b4b4: Te6edf3MapTff7b72<Tffa657StringTb4b4b4, Te6edf3DocPageTff7b72>Tb4b4b4,
Tff7b72val Te6edf3bundleVersionTb4b4b4: Tffa657StringTb4b4b4,
Tff7b72val Te6edf3generatedAtTb4b4b4: Tffa657StringTb4b4b4,
Tff7b72val Te6edf3totalBytesTb4b4b4: Tffa657LongTb4b4b4,
Tb4b4b4)


β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Field β”‚ Type β”‚ Description β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ T383838pages β”‚ T383838List<DocPage> β”‚ All bundled pages β”‚
β”‚ T383838pageIndex β”‚ T383838Map<String, DocPage> β”‚ O(1) lookup by page ID β”‚
β”‚ T383838bundleVersion β”‚ T383838String β”‚ App/docs version identifier (T383838beta, T3838382.8.0, etc.) β”‚
β”‚ T383838generatedAt β”‚ T383838String β”‚ ISO timestamp written by the build task β”‚
β”‚ T383838totalBytes β”‚ T383838Long β”‚ Total packaged size for size-budget enforcement β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Primary operations

T282828
Tff7b72interface T56d364DocBundleLoader Tb4b4b4{
Tff7b72suspend Tff7b72fun Td2a8ffloadTb4b4b4(Tb4b4b4)Tb4b4b4: Te6edf3DocBundle
Tff7b72suspend Tff7b72fun Td2a8ffreadPageTb4b4b4(Te6edf3pageIdTb4b4b4: Tffa657StringTb4b4b4)Tb4b4b4: Te6edf3DocPageContent?
Tff7b72fun Td2a8ffpagesBySectionTb4b4b4(Te6edf3sectionTb4b4b4: Te6edf3DocSectionTb4b4b4)Tb4b4b4: Te6edf3ListTff7b72<Te6edf3DocPageTff7b72>
Tb4b4b4}


Invariants
β€’ T383838pagesBySection() sorts by T383838navOrder, then title.
β€’ T383838pageIndex.keys == pages.map { it.id }.toSet().
β€’ T383838totalBytes <= 10_485_760 for release-ready bundles.


5. T383838KeywordIndexEntry

Build-time artifact decoded at runtime for keyword search and AI retrieval.

T282828
Tf0883e@Serializable
Tff7b72data Tff7b72class T56d364KeywordIndexEntryTb4b4b4(
Tff7b72val Te6edf3idTb4b4b4: Tffa657StringTb4b4b4,
Tff7b72val Te6edf3titleTb4b4b4: Tffa657StringTb4b4b4,
Tff7b72val Te6edf3sectionTb4b4b4: Tffa657StringTb4b4b4,
Tff7b72val Te6edf3resourcePathTb4b4b4: Tffa657StringTb4b4b4,
Tff7b72val Te6edf3navOrderTb4b4b4: Tffa657IntTb4b4b4,
Tff7b72val Te6edf3keywordsTb4b4b4: Te6edf3ListTff7b72<Tffa657StringTff7b72>Tb4b4b4,
Tff7b72val Te6edf3aliasesTb4b4b4: Te6edf3ListTff7b72<Tffa657StringTff7b72> Tff7b72= Te6edf3emptyListTb4b4b4(Tb4b4b4)Tb4b4b4,
Tff7b72val Te6edf3charCountTb4b4b4: Tffa657IntTb4b4b4,
Tb4b4b4)


β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Field β”‚ Type β”‚ Description β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ T383838id β”‚ T383838String β”‚ Matches T383838DocPage.id β”‚
β”‚ T383838title β”‚ T383838String β”‚ Display title β”‚
β”‚ T383838section β”‚ T383838String β”‚ T383838user or T383838developer β”‚
β”‚ T383838resourcePath β”‚ T383838String β”‚ Packaged path to HTML/markdown asset β”‚
β”‚ T383838navOrder β”‚ T383838Int β”‚ Frontmatter-derived ordering β”‚
β”‚ T383838keywords β”‚ T383838List<String> β”‚ Generated retrieval terms β”‚
β”‚ T383838aliases β”‚ T383838List<String> β”‚ Optional renamed terms and synonyms β”‚
β”‚ T383838charCount β”‚ T383838Int β”‚ Plain-text size used for token budgeting β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Validation rules
β€’ Must match the JSON schema in T383838contracts/keyword-index-schema.json.
β€’ Every entry must correspond to exactly one bundled page.


6. T383838DocSearchQuery and T383838DocSearchResult

Used by the shared keyword-search fallback and by Gemini Nano retrieval pre-ranking.

T282828
Tff7b72data Tff7b72class T56d364DocSearchQueryTb4b4b4(
Tff7b72val Te6edf3rawTextTb4b4b4: Tffa657StringTb4b4b4,
Tff7b72val Te6edf3normalizedTermsTb4b4b4: Te6edf3ListTff7b72<Tffa657StringTff7b72>Tb4b4b4,
Tb4b4b4)

Tff7b72data Tff7b72class T56d364DocSearchResultTb4b4b4(
Tff7b72val Te6edf3pageTb4b4b4: Te6edf3DocPageTb4b4b4,
Tff7b72val Te6edf3scoreTb4b4b4: Tffa657IntTb4b4b4,
Tff7b72val Te6edf3matchedTermsTb4b4b4: Te6edf3ListTff7b72<Tffa657StringTff7b72>Tb4b4b4,
Tb4b4b4)


β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Type β”‚ Purpose β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ T383838DocSearchQuery β”‚ Normalized user input after lowercasing, tokenization, alias expansion, and s… β”‚
β”‚ T383838DocSearchResult β”‚ Ranked page match used in UI search results and AI context selection β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Ranking rules
β€’ Exact keyword matches score higher than alias matches.
β€’ Title matches outrank body-keyword matches.
β€’ T383838navOrder breaks ties within a section.


7. T383838AIDocAssistant

Shared abstraction over the platform-specific docs assistant.

T282828
Tff7b72interface T56d364AIDocAssistant Tb4b4b4{
T8b949e/** Answer a user question about Meshtastic using bundled documentation context. */
Tff7b72suspend Tff7b72fun Td2a8ffanswerTb4b4b4(Te6edf3questionTb4b4b4: Tffa657StringTb4b4b4, Te6edf3currentPageIdTb4b4b4: Tffa657String? Tff7b72= Tff7b72nullTb4b4b4)Tb4b4b4: Te6edf3AIDocAssistantResult

T8b949e/** Answer a user question about Meshtastic, streaming the results as they arrive. */
Tff7b72fun Td2a8ffanswerStreamTb4b4b4(
Te6edf3questionTb4b4b4: Tffa657StringTb4b4b4,
Te6edf3currentPageIdTb4b4b4: Tffa657String? Tff7b72= Tff7b72nullTb4b4b4,
Tb4b4b4)Tb4b4b4: Te6edf3kotlinxTb4b4b4.Te6edf3coroutinesTb4b4b4.Te6edf3flowTb4b4b4.Te6edf3FlowTff7b72<Te6edf3AIDocAssistantResultTff7b72>
Tb4b4b4}


Possible runtime result model:

T282828
Tff7b72sealed Tff7b72interface T56d364AIDocAssistantResult Tb4b4b4{
Tff7b72data Tff7b72class T56d364PartialTb4b4b4(
Tff7b72val Te6edf3answerTb4b4b4: Tffa657StringTb4b4b4,
Tff7b72val Te6edf3sourcePagesTb4b4b4: Te6edf3ListTff7b72<Te6edf3DocPageTff7b72>Tb4b4b4,
Tff7b72val Te6edf3usedOnDeviceModelTb4b4b4: Tffa657BooleanTb4b4b4,
Tb4b4b4) Tb4b4b4: Te6edf3AIDocAssistantResult

Tff7b72data Tff7b72class T56d364SuccessTb4b4b4(
Tff7b72val Te6edf3answerTb4b4b4: Tffa657StringTb4b4b4,
Tff7b72val Te6edf3sourcePagesTb4b4b4: Te6edf3ListTff7b72<Te6edf3DocPageTff7b72>Tb4b4b4,
Tff7b72val Te6edf3usedOnDeviceModelTb4b4b4: Tffa657BooleanTb4b4b4,
Tb4b4b4) Tb4b4b4: Te6edf3AIDocAssistantResult

Tff7b72data Tff7b72class T56d364FallbackTb4b4b4(
Tff7b72val Te6edf3messageTb4b4b4: Tffa657StringTb4b4b4,
Tff7b72val Te6edf3suggestedPagesTb4b4b4: Te6edf3ListTff7b72<Te6edf3DocPageTff7b72>Tb4b4b4,
Tb4b4b4) Tb4b4b4: Te6edf3AIDocAssistantResult

Tff7b72data Tff7b72class T56d364ErrorTb4b4b4(
Tff7b72val Te6edf3reasonTb4b4b4: Te6edf3DocsAiErrorTb4b4b4,
Tff7b72val Te6edf3suggestedPagesTb4b4b4: Te6edf3ListTff7b72<Te6edf3DocPageTff7b72> Tff7b72= Te6edf3emptyListTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4) Tb4b4b4: Te6edf3AIDocAssistantResult
Tb4b4b4}


Associated error model:

T282828
Tff7b72sealed Tff7b72interface T56d364DocsAiError Tb4b4b4{
Tff7b72data Tff7b72object T56d364UnsupportedPlatform Tb4b4b4: Te6edf3DocsAiError
Tff7b72data Tff7b72object T56d364UnsupportedFlavor Tb4b4b4: Te6edf3DocsAiError
Tff7b72data Tff7b72object T56d364ModelUnavailable Tb4b4b4: Te6edf3DocsAiError
Tff7b72data Tff7b72object T56d364Busy Tb4b4b4: Te6edf3DocsAiError
Tff7b72data Tff7b72object T56d364TokenBudgetExceeded Tb4b4b4: Te6edf3DocsAiError
Tff7b72data Tff7b72object T56d364Unknown Tb4b4b4: Te6edf3DocsAiError
Tb4b4b4}


Platform behavior
β€’ Android T383838google flavor may return T383838Success using Gemini Nano.
β€’ T383838fdroid, Desktop, and iOS normally return T383838Fallback or T383838UnsupportedPlatform and provide suggested pages.


8. T383838AIDocAssistantSessionState

UI state for the Chirpy conversation surface.

T282828
Tff7b72data Tff7b72class T56d364AIDocAssistantSessionStateTb4b4b4(
Tff7b72val Te6edf3messagesTb4b4b4: Te6edf3ListTff7b72<Te6edf3ChirpyMessageTff7b72>Tb4b4b4,
Tff7b72val Te6edf3isLoadingTb4b4b4: Tffa657BooleanTb4b4b4,
Tff7b72val Te6edf3draftQuestionTb4b4b4: Tffa657StringTb4b4b4,
Tb4b4b4)

Tf0883e@Serializable
Tff7b72data Tff7b72class T56d364SourceRefTb4b4b4(
Tff7b72val Te6edf3idTb4b4b4: Tffa657StringTb4b4b4,
Tff7b72val Te6edf3titleTb4b4b4: Tffa657StringTb4b4b4,
Tb4b4b4)

Tf0883e@Serializable
Tff7b72data Tff7b72class T56d364ChirpyMessageTb4b4b4(
Tff7b72val Te6edf3idTb4b4b4: Tffa657StringTb4b4b4,
Tff7b72val Te6edf3roleTb4b4b4: Te6edf3ChirpyRoleTb4b4b4,
Tff7b72val Te6edf3textTb4b4b4: Tffa657StringTb4b4b4,
Tff7b72val Te6edf3sourcesTb4b4b4: Te6edf3ListTff7b72<Te6edf3SourceRefTff7b72> Tff7b72= Te6edf3emptyListTb4b4b4(Tb4b4b4)Tb4b4b4,
Tb4b4b4)

Tf0883e@Serializable
Tff7b72enum Tff7b72class T56d364ChirpyRole Tb4b4b4{ Te6edf3USERTb4b4b4, Te6edf3ASSISTANTTb4b4b4, Te6edf3SYSTEM Tb4b4b4}


Lifecycle
β€’ Session state is ephemeral and resets when the screen/process is recreated unless explicitly made saveable.
β€’ Messages are not persisted to Room.


Build-Time Artifacts

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚ Artifact β”‚ Produced By β”‚ Co… β”‚ Notes β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ T383838docs/**/*.md β”‚ Human-authored β”‚ Je… β”‚ Canonical source β”‚
β”‚ Generated HTML pages β”‚ Gradle docs gen… β”‚ An… β”‚ Site-parity artifact β”‚
β”‚ Optional bundled markdown mirror β”‚ Gradle docs gen… β”‚ De… β”‚ Keeps shared renderer path available β”‚
β”‚ T383838index.json β”‚ Gradle docs gen… β”‚ Se… β”‚ Must match schema contract β”‚
β”‚ T383838versions.yml β”‚ Release workflow β”‚ Je… β”‚ Web-only manifest β”‚
β”‚ Screenshot PNGs β”‚ Roborazzi/Papar… β”‚ Ma… β”‚ Inline illustrations β”‚
β”‚ T383838docs.css β”‚ Hand-authored/s… β”‚ HT… β”‚ Light/dark + callouts β”‚
β”‚ Chirpy SVG/vector β”‚ Design assets β”‚ Co… β”‚ Branded assistant avatar β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜


Relationships

T282828
DocBundle
β”œβ”€β”€ pages: List<DocPage>
β”œβ”€β”€ pageIndex: Map<String, DocPage>
└── page content files (HTML and/or markdown)

KeywordIndexEntry --1:1--> DocPage
DocSearchQuery --ranks--> DocSearchResult --references--> DocPage
AIDocAssistant --uses--> KeywordIndexEntry + DocPageContent
AIDocAssistantSessionState --contains--> ChirpyMessage --references--> DocPage IDs


Persistence Notes

β€’ No Room tables are required for documentation content.
β€’ No migration story is required for docs content because the corpus is versioned with the app binary.
β€’ Optional UX-only settings (for example, last-opened section) may live in T383838core:prefs, but they are intentionally excluded from this feature’s core data model.

Served by rngit 1.5.0 - Generated in 0.08s